/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.consultorio.dao;

import br.com.consultorio.bean.Perfil;
import br.com.consultorio.bean.Pessoa;
import br.com.consultorio.bean.Usuario;
import br.com.consultorio.util.CriptografaSenha;
import br.com.consultorio.util.FabricaConexao;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;

/**
 *
 * @author L3nfers
 */
public class UsuarioDaoImp implements UsuarioDao {

    Connection conn;
    PreparedStatement ps;
    ResultSet rs;
    Perfil perfil;
    CriptografaSenha criptoSenha;
    Usuario usuario;
    Pessoa pessoa;

    @Override
    public Object salvar(Object obj) throws Exception {
        return null;

      
    }

    @Override
    public void alterar(Object obj) throws Exception {
        try {
            String SQL = "UPDATE usuario SET login=?, senha=?, perfil_id=? WHERE id=?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);
            usuario = (Usuario) obj;

            ps.setString(1, usuario.getLogin());
            ps.setString(2, usuario.getSenha());
            ps.setInt(3, usuario.getPerfil().getId());
            ps.setInt(4, pessoa.getId());
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("\nUsuario - Erro ao ALTERAR " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        try {
            String SQL = "DELETE FROM usuario WHERE id = ?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);

            ps.setInt(1, id);

            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("Usuario - Ero ao EXCLUIR " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }
    }

    @Override
    public Object logar(String login, String senha) throws Exception {
        usuario = new Usuario();

        try {
            String SQL = "SELECT * FROM usuario usu "
                    + "JOIN perfil per ON per.id = usu.perfil_id "
                    + "JOIN pessoa pes ON usu.idPessoa = pes.id "
                    + "JOIN funcionario func ON func.idPessoa = pes.id "
                    + "WHERE usu.login = ? AND usu.senha = ?";

            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);

            ps.setString(1, login);
            ps.setString(2, senha);

            rs = ps.executeQuery();

            if (rs.next()) {
                pessoa = new Pessoa();
                pessoa.setId(rs.getInt("pes.id"));
                pessoa.setNome(rs.getString("pes.nome"));
                pessoa.setEmail(rs.getString("pes.email"));
                pessoa.setCpf(rs.getString("pes.cpf"));
                pessoa.setTelefone(rs.getString("pes.telefone"));


                perfil = new Perfil();
                perfil.setId(rs.getInt("per.id"));
                perfil.setNome(rs.getString("per.nome"));
                perfil.setDescricao(rs.getString("per.descricao"));


                pessoa.setId(rs.getInt("pes.id"));
                usuario.setLogin(rs.getString("usu.login"));
                usuario.setSenha(rs.getString("usu.senha"));
                usuario.setUltimoAcesso(rs.getString("ultimoAcesso"));
                usuario.setLogado(true);
                usuario.setPerfil(perfil);
            }


        } catch (Exception e) {
            throw new Exception("Usuário - Erro ao LOGAR " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps, rs);
        }

        return usuario;
    }

    @Override
    public Object alteraAcesso(Object usuario) throws Exception {

        this.usuario = (Usuario) usuario;

        try {
            String SQL = "UPDATE usuario SET senha = ? WHERE idPessoa = ?";

            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);

            ps.setString(1, this.usuario.getSenha());
            ps.setInt(2, this.pessoa.getId());

            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("Usuário - Erro ao tentar ALTERAR SENHA " + e.getMessage());
        }

        return this.usuario;
    }

    @Override
    public void alteraSenha(Object usuario) throws Exception {
        this.usuario = (Usuario) usuario;

        try {
            String SQL = "UPDATE usuario SET senha = ? WHERE idPessoa = ?";

            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);

            ps.setString(1, this.usuario.getSenha());
            ps.setInt(2, this.pessoa.getId());

            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("Usuário - Erro ao tentar ALTERAR SENHA NO PRIMEIRO LOGIN" + e.getMessage());
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Object> listar() throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void salvaUsuario(Object obj) throws Exception {
        pessoa = (Pessoa) obj;
        criptoSenha = new CriptografaSenha();
        try {
            String SQL = "INSERT INTO usuario (idPessoa, login, senha, ultimoAcesso, perfil_id) VALUES (?, ?, ?, ?, ?)";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, pessoa.getId());
            ps.setString(2, pessoa.getUsuario().getLogin());
            ps.setString(3, pessoa.getUsuario().getSenha());
            ps.setString(4, pessoa.getUsuario().getUltimoAcesso());
            ps.setInt(5, pessoa.getUsuario().getPerfil().getId());
            ps.executeUpdate();
            
        } catch (Exception e) {
            throw new Exception("\nUsuario - Erro ao SALVAR " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }
    }

    @Override
    public void alteraUsuario(Object obj) throws Exception {
        try {
            String SQL = "UPDATE usuario SET login=?, senha=?, perfil_id=? WHERE idPessoa=?";
            conn = FabricaConexao.abreConexao();
            ps = conn.prepareStatement(SQL);
            pessoa = (Pessoa) obj;
            ps.setString(1, pessoa.getUsuario().getLogin());
            ps.setString(2, pessoa.getUsuario().getSenha());
            ps.setInt(3, pessoa.getUsuario().getPerfil().getId());
            ps.setInt(4, pessoa.getId());
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception("\nUsuario - Erro ao ALTERAR " + e.getMessage());
        } finally {
            FabricaConexao.fechaConexao(conn, ps);
        }
    }
}
